package edu.xidian.onlinedocument.handler.filter;

import com.alibaba.fastjson.JSON;
import edu.xidian.onlinedocument.views.Request;
import org.springframework.core.annotation.Order;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 过滤器不能调用Service层的代码，即不能使用spring boot的代码
 * 不能做到检查token的作用
 * 但是如果token有关键信息也可以只用过滤器取出来
 * 区别可以参照这个博客：https://blog.csdn.net/heweimingming/article/details/79993591
 */

@Order(1)       // 过滤器链，Order(1)代表是第一个过滤器
@WebFilter(filterName = "documentFilter", urlPatterns = "/api/document/*")
public class DocumentFilter implements Filter {

    private final static String tokenName = "token";

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest request,
                         ServletResponse response,
                         FilterChain chain)
            throws IOException, ServletException {
        /*
         * ServletRequest
         *
         * 解析：代表来自客户端的请求。当Servlet容器接收到客户端的要求访问特定Servlet的请求时，容器先解析客户端的原始请求数据，把它包装成一个ServletRequest对象。
         *
         * 常用方法：
         * 1、getContentLength() 请求正文的长度(大小)，如果未知返回-1
         * 2、getContentType() 请求正文的MIME类型，比如一般post请求是：application/json
         * 3、getLocalAddr() 服务器本机IP地址，注意是ipv6格式
         * 4、getLocalName() 服务端主机名，注意是主机名，不是主机IP，比如我从本地起服务，localName即localhost
         * 5、getRemoteAddr() 远程IP地址
         * 备注：这里返回的是ipv6，因为我测试用的是本机，地址为0:0:0:0:0:0:0:1，转换为ipv4即127.0.0.1
         * 6、getProtocol() 获取协议及版本号
         * 7、getParameter 获取从Web客户端传到Web服务器端的数据，通常是从Web客户端的Form表单中获取
         * 8、getReader() 获取输入字符流（只能获取一次）
         * 9、getInputStream() 获取输入字节流（只能获取一次）
         * 10、getAttribute()与setAttribute() 两者传递的数据只会存在于Web容器内部，在具有转发关系的Web组件之间传递。传递的数据可以是任何Object 子类的实例。
         */
        /*
         * HttpServletRequest和HttpServletResponse继承自ServletRequest和ServletResponse
         * 多一些实用方法，如
         * 1、getQueryString() 地址URL里？后面的部分
         * 2、getRequestURI() 接口地址，如"/api/document"
         * 3、getRequestURL() 完整地址（不包括？），如"http://localhost:8080/api/document"
         */
        // HttpServletRequest httpRequest = (HttpServletRequest) request;
        //HttpServletResponse httpResponse = (HttpServletResponse) response;

        // String token = httpRequest.getHeader(tokenName);
        /*
        doFilter是一定要有的，否则请求进入过滤器就结束了
        doFilter会将请求转发给过滤器链上下一个对象，即有着@Order(2)标识的下一个过滤器，如果没有下一个就转发给Controller
        一般只分析不修改的话直接传原始参数就行
         */
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}
